import userApi from '@/api/usersApi';
import { useUserStore } from '@/store';
import type { IMenu, IUser } from '@/types/api';
import { getMenuPath } from '@/utils/index';

export interface IAuthLoader {
    buttonList: string[];
    menuList: IMenu.MenuItem[];
    menuPathList: string[];
    userInfo: IUser.UserItem;
}

/**加载页面前，先执行Loader，获取权限列表，再根据权限列表动态生成左侧菜单。
 * 1.调用请求权限和用户信息接口
 * 2.递归生成页面路径（后续页面权限判断使用）
 * 3.返回用户信息、页面路径、菜单列表、按钮列表
 * @returns
 */
export default async function AuthLoader(): Promise<IAuthLoader> {
    try {
        // 并发请求权限和用户信息
        const [permissionRes, userInfoRes] = await Promise.all([userApi.getPermissionList(), userApi.getUserInfo()]);
        const { buttonList, menuList } = permissionRes.data;
        const userInfo = userInfoRes.data;
        const menuPathList = getMenuPath(menuList);

        // 把数据存入 Zustand
        useUserStore.getState().updateUserInfo(userInfo);

        // 返回数据，供 useLoaderData 使用
        return {
            userInfo,
            menuList,
            menuPathList,
            buttonList
        };
    } catch (error: any) {
        // 错误处理：可根据实际需求自定义
        // 1. 可以抛出错误，让路由 ErrorBoundary 捕获
        // 2. 也可以返回默认空数据，页面可根据数据判断展示
        // 这里选择抛出错误，推荐配合 ErrorBoundary 使用
        throw new Error(error?.message || '权限或用户信息加载失败');
    }
}
